<?php
/**
 * Helper methods
 *
 * @package     Kirki
 * @category    Core
 * @author      Aristeides Stathopoulos
 * @copyright   Copyright (c) 2016, Aristeides Stathopoulos
 * @license     http://opensource.org/licenses/gpl-2.0.php GNU Public License
 * @since       1.0
 */

// Exit if accessed directly
if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

if ( ! class_exists( 'Kirki_Helper' ) ) {
	class Kirki_Helper {

		/**
		 * Recursive replace in arrays.
		 *
		 * @param $array    array
		 * @param $array1   array
		 *
		 * @return mixed
		 */
		public static function array_replace_recursive( $array, $array1 ) {
			if ( function_exists( 'array_replace_recursive' ) ) {
				return array_replace_recursive( $array, $array1 );
			}
			// handle the arguments, merge one by one
			$args  = func_get_args();
			$array = $args[0];
			if ( ! is_array( $array ) ) {
				return $array;
			}
			$count = count( $args );
			for ( $i = 1; $i < $count; $i++ ) {
				if ( is_array( $args[ $i ] ) ) {
					$array = self::recurse( $array, $args[ $i ] );
				}
			}
			return $array;
		}

		/**
		 * @return array
		 */
		public static function recurse( $array, $array1 ) {
			foreach ( $array1 as $key => $value ) {
				// create new key in $array, if it is empty or not an array
				if ( ! isset( $array[ $key ] ) || ( isset( $array[ $key ] ) && ! is_array( $array[ $key ] ) ) ) {
					$array[ $key ] = array();
				}

				// overwrite the value in the base array
				if ( is_array( $value ) ) {
					$value = self::recurse( $array[ $key ], $value );
				}
				$array[ $key ] = $value;
			}
			return $array;
		}

		/**
		 * Initialize the WP_Filesystem
		 */
		public static function init_filesystem() {
			global $wp_filesystem;
			if ( empty( $wp_filesystem ) ) {
				require_once( ABSPATH . '/wp-admin/includes/file.php' );
				WP_Filesystem();
			}
		}

		/**
		 * Returns the attachment object
		 *
		 * @var 	string		URL to the image
		 * @return 	string		numeric ID of the attachement.
		 */
		public static function get_image_id( $url ) {
			return url_to_postid( $url );
		}

		/**
		 * Returns an array of the attachment's properties.
		 *
		 * @var 	string		URL to the image
		 * @return 	array		array()
		 */
		public static function get_image_from_url( $url ) {

			$image_id = self::get_image_id( $url );
			$image    = wp_get_attachment_image_src( $image_id, 'full' );

			return array(
				'url'       => $image[0],
				'width'     => $image[1],
				'height'    => $image[2],
				'thumbnail' => $image[3],
			);

		}

		/**
		 * Helper function that gets posts and fomats them in a way so they can be used in select fields etc.
		 */
		public static function get_posts( $args ) {

			// Get the posts
			$posts = get_posts( $args );

			// properly format the array.
			$items = array();
			foreach ( $posts as $post ) {
				$items[ $post->ID ] = $post->post_title;
			}

			return $items;

		}

		public static function get_taxonomies() {

			$items = array();

			// Get the taxonomies
			$taxonomies = get_taxonomies( array( 'public' => true ) );
			// Build the array
			foreach ( $taxonomies as $taxonomy ) {
				$id           = $taxonomy;
				$taxonomy     = get_taxonomy( $taxonomy );
				$items[ $id ] = $taxonomy->labels->name;
			}

			return $items;

		}

		public static function get_post_types() {

			$items = array();

			// Get the post types
			$post_types = get_post_types( array( 'public' => true ), 'objects' );
			// Build the array
			foreach ( $post_types as $post_type ) {
				$items[ $post_type->name ] = $post_type->labels->name;
			}

			return $items;

		}

		public static function get_terms( $taxonomies ) {

			$items = array();

			// Get the post types
			$terms = get_terms( $taxonomies );
			// Build the array
			foreach ( $terms as $term ) {
				$items[ $term->term_id ] = $term->name;
			}

			return $items;

		}

		public static function get_material_design_colors( $context = false ) {

			$colors = array(
				'primary' => array(
					'#FFFFFF', '#000000', '#F44336', '#E91E63', '#9C27B0', '#673AB7', '#3F51B5', '#2196F3', '#03A9F4', '#00BCD4', '#009688', '#4CAF50', '#8BC34A', '#CDDC39', '#FFEB3B', '#FFC107', '#FF9800', '#FF5722', '#795548', '#9E9E9E', '#607D8B',
				),
				'red' => array(
					'#FFEBEE', '#FFCDD2', '#EF9A9A', '#E57373', '#EF5350', '#F44336', '#E53935', '#D32F2F', '#C62828', '#B71C1C', '#FF8A80', '#FF5252', '#FF1744', '#D50000',
				),
				'pink' => array(
					'#FCE4EC', '#F8BBD0', '#F48FB1', '#F06292', '#EC407A', '#E91E63', '#D81B60', '#C2185B', '#AD1457', '#880E4F', '#FF80AB', '#FF4081', '#F50057', '#C51162',
				),
				'purple' => array(
					'#F3E5F5', '#E1BEE7', '#CE93D8', '#BA68C8', '#AB47BC', '#9C27B0', '#8E24AA', '#7B1FA2', '#6A1B9A', '#4A148C', '#EA80FC', '#E040FB', '#D500F9', '#AA00FF',
				),
				'deep-purple' => array(
					'#EDE7F6', '#D1C4E9', '#B39DDB', '#9575CD', '#7E57C2', '#673AB7', '#5E35B1', '#512DA8', '#4527A0', '#311B92', '#B388FF', '#7C4DFF', '#651FFF', '#6200EA',
				),
				'indigo' => array(
					'#E8EAF6', '#C5CAE9', '#9FA8DA', '#7986CB', '#5C6BC0', '#3F51B5', '#3949AB', '#303F9F', '#283593', '#1A237E', '#8C9EFF', '#536DFE', '#3D5AFE', '#304FFE',
				),
				'blue' => array(
					'#E3F2FD', '#BBDEFB', '#90CAF9', '#64B5F6', '#42A5F5', '#2196F3', '#1E88E5', '#1976D2', '#1565C0', '#0D47A1', '#82B1FF', '#448AFF', '#2979FF', '#2962FF',
				),
				'light_blue' => array(
					'#E1F5FE', '#B3E5FC', '#81D4fA', '#4fC3F7', '#29B6FC', '#03A9F4', '#039BE5', '#0288D1', '#0277BD', '#01579B', '#80D8FF', '#40C4FF', '#00B0FF', '#0091EA',
				),
				'cyan' => array(
					'#E0F7FA', '#B2EBF2', '#80DEEA', '#4DD0E1', '#26C6DA', '#00BCD4', '#00ACC1', '#0097A7', '#00838F', '#006064', '#84FFFF', '#18FFFF', '#00E5FF', '#00B8D4',
				),
				'teal' => array(
					'#E0F2F1', '#B2DFDB', '#80CBC4', '#4DB6AC', '#26A69A', '#009688', '#00897B', '#00796B', '#00695C', '#004D40', '#A7FFEB', '#64FFDA', '#1DE9B6', '#00BFA5',
				),
				'green' => array(
					'#E8F5E9', '#C8E6C9', '#A5D6A7', '#81C784', '#66BB6A', '#4CAF50', '#43A047', '#388E3C', '#2E7D32', '#1B5E20', '#B9F6CA', '#69F0AE', '#00E676', '#00C853',
				),
				'light-green' => array(
					'#F1F8E9', '#DCEDC8', '#C5E1A5', '#AED581', '#9CCC65', '#8BC34A', '#7CB342', '#689F38', '#558B2F', '#33691E', '#CCFF90', '#B2FF59', '#76FF03', '#64DD17',
				),
				'lime' => array(
					'#F9FBE7', '#F0F4C3', '#E6EE9C', '#DCE775', '#D4E157', '#CDDC39', '#C0CA33', '#A4B42B', '#9E9D24', '#827717', '#F4FF81', '#EEFF41', '#C6FF00', '#AEEA00',
				),
				'yellow' => array(
					'#FFFDE7', '#FFF9C4', '#FFF590', '#FFF176', '#FFEE58', '#FFEB3B', '#FDD835', '#FBC02D', '#F9A825', '#F57F17', '#FFFF82', '#FFFF00', '#FFEA00', '#FFD600',
				),
				'amber' => array(
					'#FFF8E1', '#FFECB3', '#FFE082', '#FFD54F', '#FFCA28', '#FFC107', '#FFB300', '#FFA000', '#FF8F00', '#FF6F00', '#FFE57F', '#FFD740', '#FFC400', '#FFAB00',
				),
				'orange' => array(
					'#FFF3E0', '#FFE0B2', '#FFCC80', '#FFB74D', '#FFA726', '#FF9800', '#FB8C00', '#F57C00', '#EF6C00', '#E65100', '#FFD180', '#FFAB40', '#FF9100', '#FF6D00',
				),
				'deep-orange' => array(
					'#FBE9A7', '#FFCCBC', '#FFAB91', '#FF8A65', '#FF7043', '#FF5722', '#F4511E', '#E64A19', '#D84315', '#BF360C', '#FF9E80', '#FF6E40', '#FF3D00', '#DD2600',
				),
				'brown' => array(
					'#EFEBE9', '#D7CCC8', '#BCAAA4', '#A1887F', '#8D6E63', '#795548', '#6D4C41', '#5D4037', '#4E342E', '#3E2723',
				),
				'grey' => array(
					'#FAFAFA', '#F5F5F5', '#EEEEEE', '#E0E0E0', '#BDBDBD', '#9E9E9E', '#757575', '#616161', '#424242', '#212121', '#000000', '#ffffff',
				),
				'blue-grey' => array(
					'#ECEFF1', '#CFD8DC', '#B0BBC5', '#90A4AE', '#78909C', '#607D8B', '#546E7A', '#455A64', '#37474F', '#263238',
				),
			);

			switch ( $context ) {

				case '50':
				case '100':
				case '200':
				case '300':
				case '400':
				case '500':
				case '600':
				case '700':
				case '800':
				case '900':
				case 'A100':
				case 'A200':
				case 'A400':
				case 'A700':
					if ( 'A100' == $context ) {
						$key = 10;
						unset( $colors['grey'] );
					} elseif ( 'A200' == $context ) {
						$key = 11;
						unset( $colors['grey'] );
					} elseif ( 'A400' == $context ) {
						$key = 12;
						unset( $colors['grey'] );
					} elseif ( 'A700' == $context ) {
						$key = 13;
						unset( $colors['grey'] );
					} else {
						$key = $context / 100;
					}
					unset( $colors['primary'] );
					$position_colors = array();
					foreach ( $colors as $color_family ) {
						if ( isset( $color_family[ $key ] ) ) {
							$position_colors[] = $color_family[ $key ];
						}
					}
					return $position_colors;
				case 'all':
					unset( $colors['primary'] );
					$all_colors = array();
					foreach ( $colors as $color_family ) {
						foreach ( $color_family as $color ) {
							$all_colors[] = $color;
						}
					}
					return $all_colors;
				case 'primary':
					return $colors['primary'];
				default:
					if ( isset( $colors[ $context ] ) ) {
						return $colors[ $context ];
					}
					return $colors['primary'];
			}
		}

		public static function get_dashicons() {

			$admin_menu = array(
				'menu',
				'admin-site',
				'dashboard',
				'admin-post',
				'admin-media',
				'admin-links',
				'admin-page',
				'admin-comments',
				'admin-appearance',
				'admin-plugins',
				'admin-users',
				'admin-tools',
				'admin-settings',
				'admin-network',
				'admin-home',
				'admin-generic',
				'admin-collapse',
				'filter',
				'admin-customizer',
				'admin-multisite',
			);

			$welcome_screen = array(
				'welcome-write-blog',
				'welcome-add-page',
				'welcome-view-site',
				'welcome-widgets-menus',
				'welcome-comments',
				'welcome-learn-more',
			);

			$post_formats = array(
				'format-aside',
				'format-image',
				'format-gallery',
				'format-video',
				'format-status',
				'format-quote',
				'format-chat',
				'format-audio',
				'camera',
				'images-alt',
				'images-alt2',
				'video-alt',
				'video-alt2',
				'video-alt3',
			);

			$media = array(
				'media-archive',
				'media-audio',
				'media-code',
				'media-default',
				'media-document',
				'media-interactive',
				'media-spreadsheet',
				'media-text',
				'media-video',
				'playlist-audio',
				'playlist-video',
				'controls-play',
				'controls-pause',
				'controls-forward',
				'controls-skipforward',
				'controls-back',
				'controls-skipback',
				'controls-repeat',
				'controls-volumeon',
				'controls-volumeoff',
			);

			$image_editing = array(
				'image-crop',
				'image-rotate',
				'image-rotate-left',
				'image-rotate-right',
				'image-flip-vertical',
				'image-flip-horizontal',
				'image-filter',
				'undo',
				'redo',
			);

			$tinymce = array(
				'editor-bold',
				'editor-italic',
				'editor-ul',
				'editor-ol',
				'editor-quote',
				'editor-alignleft',
				'editor-aligncenter',
				'editor-alignright',
				'editor-insertmore',
				'editor-spellcheck',
				'editor-expand',
				'editor-contract',
				'editor-kitchensink',
				'editor-underline',
				'editor-justify',
				'editor-textcolor',
				'editor-paste-word',
				'editor-paste-text',
				'editor-removeformatting',
				'editor-video',
				'editor-customchar',
				'editor-outdent',
				'editor-indent',
				'editor-help',
				'editor-strikethrough',
				'editor-unlink',
				'editor-rtl',
				'editor-break',
				'editor-code',
				'editor-paragraph',
				'editor-table',
			);

			$posts = array(
				'align-left',
				'align-right',
				'align-center',
				'align-none',
				'lock',
				'unlock',
				'calendar',
				'calendar-alt',
				'visibility',
				'hidden',
				'post-status',
				'edit',
				'trash',
				'sticky',
			);

			$sorting = array(
				'external',
				'arrow-up',
				'arrow-down',
				'arrow-right',
				'arrow-left',
				'arrow-up-alt',
				'arrow-down-alt',
				'arrow-right-alt',
				'arrow-left-alt',
				'arrow-up-alt2',
				'arrow-down-alt2',
				'arrow-right-alt2',
				'arrow-left-alt2',
				'sort',
				'leftright',
				'randomize',
				'list-view',
				'exerpt-view',
				'grid-view',
			);

			$social = array(
				'share',
				'share-alt',
				'share-alt2',
				'twitter',
				'rss',
				'email',
				'email-alt',
				'facebook',
				'facebook-alt',
				'googleplus',
				'networking',
			);

			$wordpress_org = array(
				'hammer',
				'art',
				'migrate',
				'performance',
				'universal-access',
				'universal-access-alt',
				'tickets',
				'nametag',
				'clipboard',
				'heart',
				'megaphone',
				'schedule',
			);

			$products = array(
				'wordpress',
				'wordpress-alt',
				'pressthis',
				'update',
				'screenoptions',
				'info',
				'cart',
				'feedback',
				'cloud',
				'translation',
			);

			$taxonomies = array(
				'tag',
				'category',
			);

			$widgets = array(
				'archive',
				'tagcloud',
				'text',
			);

			$notifications = array(
				'yes',
				'no',
				'no-alt',
				'plus',
				'plus-alt',
				'minus',
				'dismiss',
				'marker',
				'star-filled',
				'star-half',
				'star-empty',
				'flag',
				'warning',
			);

			$misc = array(
				'location',
				'location-alt',
				'vault',
				'shield',
				'shield-alt',
				'sos',
				'search',
				'slides',
				'analytics',
				'chart-pie',
				'chart-bar',
				'chart-line',
				'chart-area',
				'groups',
				'businessman',
				'id',
				'id-alt',
				'products',
				'awards',
				'forms',
				'testimonial',
				'portfolio',
				'book',
				'book-alt',
				'download',
				'upload',
				'backup',
				'clock',
				'lightbulb',
				'microphone',
				'desktop',
				'tablet',
				'smartphone',
				'phone',
				'index-card',
				'carrot',
				'building',
				'store',
				'album',
				'palmtree',
				'tickets-alt',
				'money',
				'smiley',
				'thumbs-up',
				'thumbs-down',
				'layout',
			);

			return array(
				'admin-menu'     => $admin_menu,
				'welcome-screen' => $welcome_screen,
				'post-formats'   => $post_formats,
				'media'          => $media,
				'image-editing'  => $image_editing,
				'tinymce'        => $tinymce,
				'posts'          => $posts,
				'sorting'        => $sorting,
				'social'         => $social,
				'wordpress_org'  => $wordpress_org,
				'products'       => $products,
				'taxonomies'     => $taxonomies,
				'widgets'        => $widgets,
				'notifications'  => $notifications,
				'misc'           => $misc,
			);

		}

	}

}
